/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.yamaha.bikedesalon.util;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.StrictMode;
import android.widget.Toast;

/**
 * Class containing some static utility methods.
 */
public class Utils {

	private static final List<AlertDialog> dialogs = new ArrayList<AlertDialog>();

	private Utils() {
	}

	@TargetApi(11)
	public static void enableStrictMode() {
		if (Utils.hasGingerbread()) {
			final StrictMode.ThreadPolicy.Builder threadPolicyBuilder = new StrictMode.ThreadPolicy.Builder()
					.detectAll().penaltyLog();
			final StrictMode.VmPolicy.Builder vmPolicyBuilder = new StrictMode.VmPolicy.Builder()
					.detectAll().penaltyLog();

			// if (Utils.hasHoneycomb()) {
			// threadPolicyBuilder.penaltyFlashScreen();
			// vmPolicyBuilder.setClassInstanceLimit(ImageGridActivity.class,
			// 1).setClassInstanceLimit(ImageDetailActivity.class, 1);
			// }
			StrictMode.setThreadPolicy(threadPolicyBuilder.build());
			StrictMode.setVmPolicy(vmPolicyBuilder.build());
		}
	}

	public static boolean hasFroyo() {
		// Can use static final constants like FROYO, declared in later versions
		// of the OS since they are inlined at compile time. This is guaranteed
		// behavior.
		return Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO;
	}

	public static boolean hasGingerbread() {
		return Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD;
	}

	public static boolean hasHoneycomb() {
		return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
	}

	public static boolean hasHoneycombMR1() {
		return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1;
	}

	// public static boolean hasJellyBean() {
	// return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
	// }

	public static Date getDateFromUnixTimeStamp(final long unixtimeStamp) {
		return new Date(unixtimeStamp * 1000);
	}

	public static boolean isNetworkConnected(final Context context) {
		final ConnectivityManager connectivity = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		if (connectivity != null) {
			final NetworkInfo[] info = connectivity.getAllNetworkInfo();
			if (info != null) {
				for (int i = 0; i < info.length; i++) {
					if (info[i].getState() == NetworkInfo.State.CONNECTED) {
						return true;
					}
				}
			}

		}
		return false;
	}

	public static void closeAllDialog() {
		synchronized (Utils.dialogs) {

			final AlertDialog[] alertDialogs = Utils.dialogs
					.toArray(new AlertDialog[Utils.dialogs.size()]);

			for (int i = 0; i < alertDialogs.length; i++) {
				try {
					alertDialogs[i].dismiss();
					alertDialogs[i].hide();
					alertDialogs[i].cancel();
				} catch (final IllegalArgumentException e) {
					LogUtil.e("Utils", e.getMessage(), e);
				}
				Utils.dialogs.remove(alertDialogs[i]);
			}
		}
	}

	public static ProgressDialog showProgressDialog(final Context context,
			final String title, final String message) {
		Utils.closeAllDialog();

		final ProgressDialog dialog;
		synchronized (Utils.dialogs) {
			dialog = ProgressDialog.show(context, title, message);
			Utils.dialogs.add(dialog);
		}
		return dialog;
	}

	public static AlertDialog showAlertDialog(final Context context,
			final String title, final String message) {

		Utils.closeAllDialog();

		final AlertDialog.Builder builder = new AlertDialog.Builder(context);
		builder.setTitle(title);
		builder.setMessage(message);

		final AlertDialog dialog = builder.create();
		synchronized (Utils.dialogs) {
			Utils.dialogs.add(dialog);
		}
		return dialog;
	}

	public static void showToast(final Context context, final String message) {
		Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
	}

	public static void showToast(final Context context, final Throwable e) {
		Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
	}
}
